package com.yellowcong.kanman;


import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.yellowcong.http.utils.HttpClient;
import com.yellowcong.http.utils.HttpImageUtils;
import com.yellowcong.kanman.dto.Chapter;

/**
 * 创建日期:2018年2月27日<br/>
 * 创建时间:下午9:14:48<br/>
 * 创建者    :yellowcong<br/>
 * 机能概要:
 */
public class Main {

	public static void main(String [] args){
		//64是多少章
		//4 是多少页
		//http://mhpic.manhualang.com/comic/D/%E6%96%97%E7%BD%97%E5%A4%A7%E9%99%86%E6%8B%86%E5%88%86%E7%89%88/61%E8%AF%9D/4.jpg-kmw.middle
		
		//获取到所有的章节信息了
		List<Chapter>  chapters = getAllChapter(Constants.HOME_URL);
		
		//遍历所有的章节
		for(Chapter  chapter:chapters ) {
			downloadChapter(chapter);
		}
		
	}
	/**
	  * 创建日期:2018/02/28<br/>
	  * 创建时间:10:08:28<br/>
	  * 创建用户:yellowcong<br/>
	  * 机能概要:下载一个章节的数据
	  * @param chapter 
	  * @return 是否下载成功
	 */
	public static boolean downloadChapter(Chapter  chapter) {
		HttpImageUtils utils = HttpImageUtils.getInstance();
		
		//创建文件夹,当文件不存在的情况
		String outPath = mkdirIfNotExit(chapter);
		
		//下载这一章的所有图片
		for(int i=0;i<chapter.getSize();i++) {
			
			//图片的下载地址
			String urlPathStr = String.format(Constants.PIC_HOST_URL, chapter.getChapterNow(),i+1);
			
			///4.jpg-kmw.middle
			String imgName = urlPathStr.substring(urlPathStr.lastIndexOf("/")+1);
			
			//获取文件输出地址
			imgName = outPath+"\\"+imgName.replace("-kmw.middle", "");
			
			//打印文件下载图片地址
			System.out.println(imgName);
			
			//下载图片
			utils.downloadImage(urlPathStr, imgName);
			
		}
		return true;
	}
    /**
     * 创建日期:2018/02/28<br/>
     * 创建时间:9:34:15<br/>
     * 创建用户:yellowcong<br/>
     * 机能概要:创建文件夹，如果不存在的情况
     * @param path
     * @return 反回文件夹地址
    */
	public static String mkdirIfNotExit(Chapter chapter) {
		//上一层的文件夹名称
		String outChapterPathName = Constants.OUT_PATH+chapter.getTitle();
		File file = new File(outChapterPathName);
		
		if(!file.exists()) {
			file.mkdirs();
		}
		return file.getAbsolutePath();
		
	}
	/**
	  * 创建日期:2018/02/28<br/>
	  * 创建时间:9:56:09<br/>
	  * 创建用户:yellowcong<br/>
	  * 机能概要:
	  * @param path 需要爬取的漫画地址
	  * @return 返回所有的章节信息，包含每章的页面大小
      */
	public static List<Chapter> getAllChapter(String path){
		String htmlStr = HttpClient.get(path);

        //将解析的html转化为
        Document homeDoc = Jsoup.parse(htmlStr);

        //获取到所有的链接
        Element element = homeDoc.select(".chapter-list").first();

        //获取所有的章节信息
        Elements pages = element.getElementsByTag("a");
        
        System.out.println("章节数目\t"+pages.size());
        
        List<Chapter> chapters = new ArrayList<Chapter>();
        for(int i=0;i<pages.size();i++) {
            Element node = pages.get(i);
            
            //每一章节的地址
            String chapterUrl = Constants.HOME_URL + node.attr("href");
            String regEx = "([\\d]+)([\\w]*)";
    		
    		Pattern pattern = Pattern.compile(regEx);
            Matcher matcher = pattern.matcher(node.attr("href"));
            String chapterNow =  "";
            if(matcher.find()){
            	chapterNow = matcher.group(1);
            }
            //章节的名称
            String chapterNm = node.html();
            //章节大小
            int size = getPageSize(chapterUrl);
            
            //TODO　章节大小问题
            System.out.printf("第%s章:%s\t地址:%s\t页面数:%s\r\n",chapterNow,chapterNm,chapterUrl,size);
            
            Chapter chapter = new Chapter(chapterNm,chapterUrl,Integer.parseInt(chapterNow), size);
            //不要番外的信息
            if(chapter.getTitle().indexOf("番外") <0) {
            	chapters.add(chapter);
            	downloadChapter(chapter);
            }
        }
        return chapters;
	}
	
	/**
	 * 创建日期:2018年2月27日<br/>
	 * 创建时间:下午9:55:59<br/>
	 * 创建用户:yellowcong<br/>
	 * 机能概要:获取网站的页面条数
	 * @param chapterUrl 章节数目
	 * 比如 http://m.kanman.com/25933/412.html
	 * @return 
	 */
	public static int getPageSize(String chapterUrl){
		//get pageInfo
        try {
			String htmlStr = HttpClient.get(chapterUrl);

			String pageInfostr = htmlStr.substring(htmlStr.indexOf("totalimg"),htmlStr.indexOf("mhname"));
			
			String regEx = "([\\w]+:)([\\d]+)(,[\\w]*)";
			
			Pattern pattern = Pattern.compile(regEx);
			Matcher matcher = pattern.matcher(pageInfostr);
			
			if(matcher.find()){
				int pageSize = Integer.parseInt(matcher.group(2));
				return pageSize;
			}
		} catch (Exception e) {
			throw new RuntimeException(chapterUrl+"页面获取失败");
		}
		return 0;
	}
	
}
